import cv2
import numpy as np

if __name__ == '__main__':
    # 1. 图片输入
    path = 'girl.jpg'
    image_np = cv2.imread(path)
    if image_np is None:
        print("无法读取图像，请检查路径是否正确")
        exit()

    # 2. 中值滤波（先降噪，保留彩色信息）
    no_noise_image = cv2.medianBlur(
        image_np,
        5  # 核大小5，平衡降噪与细节
    )

    # 3. 灰度化（用于后续边缘增强）
    image_grey = cv2.cvtColor(no_noise_image, cv2.COLOR_BGR2GRAY)

    # 4. 膨胀操作（增强灰度图边缘，让轮廓更清晰）
    kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3))
    dilated_grey = cv2.dilate(image_grey, kernel, iterations=1)

    # 5. 边缘差异增强（膨胀后的边缘 - 原灰度边缘，突出轮廓）
    edge_enhance = cv2.subtract(dilated_grey, image_grey)  # 得到边缘增强部分
    edge_enhance = cv2.addWeighted(edge_enhance, 1.5, np.zeros_like(edge_enhance), 0, 0)  # 增强边缘对比度

    # 6. 将边缘信息融合回彩色图像（保留原图色彩，叠加增强的边缘）
    edge_enhance_3ch = cv2.cvtColor(edge_enhance, cv2.COLOR_GRAY2BGR)
    final_color = cv2.addWeighted(no_noise_image, 0.7, edge_enhance_3ch, 0.3, 0)

    # 7. 添加亮度补偿（关键步骤：解决图像变暗问题）
    # alpha=1保持对比度不变，beta调整亮度（正值提亮，建议10~30）
    brightness_beta = 40  # 可根据效果调整（10-40之间）
    final_color_bright = cv2.convertScaleAbs(final_color, alpha=1, beta=brightness_beta)

    # 8. 输出结果
    cv2.imshow('Original', image_np)
    cv2.imshow('Final with Brightness Adjustment', final_color_bright)
    cv2.imwrite('Without freckle.jpg', final_color_bright)
    cv2.waitKey(0)
    cv2.destroyAllWindows()